goto out;
}
- if ( hvm )
+ /* Get page types */
+ if ( xc_get_pfn_type_batch(xch, dom, batch, pfn_type) )
{
- /* Look for and skip completely empty batches. */
- for ( j = 0; j < batch; j++ )
- {
- if ( !pfn_err[j] )
- break;
- pfn_type[j] |= XEN_DOMCTL_PFINFO_XTAB;
- }
- if ( j == batch )
- {
- munmap(region_base, batch*PAGE_SIZE);
- continue; /* bail on this batch: no valid pages */
- }
- for ( ; j < batch; j++ )
- if ( pfn_err[j] )
- pfn_type[j] |= XEN_DOMCTL_PFINFO_XTAB;
+ PERROR("get_pfn_type_batch failed");
+ goto out;
}
- else
+
+ for ( run = j = 0; j < batch; j++ )
{
- /* Get page types */
- if ( xc_get_pfn_type_batch(xch, dom, batch, pfn_type) )
- {
- PERROR("get_pfn_type_batch failed");
- goto out;
- }
+ unsigned long gmfn = pfn_batch[j];
- for ( j = 0; j < batch; j++ )
+ if ( !hvm )
+ gmfn = pfn_to_mfn(gmfn);
+
+ if ( pfn_err[j] )
{
- unsigned long mfn = pfn_to_mfn(pfn_batch[j]);
-
if ( pfn_type[j] == XEN_DOMCTL_PFINFO_XTAB )
- {
- DPRINTF("type fail: page %i mfn %08lx\n",
- j, mfn);
continue;
- }
-
- if ( debug )
+ DPRINTF("map fail: page %i mfn %08lx err %d\n",
+ j, gmfn, pfn_err[j]);
+ pfn_type[j] = XEN_DOMCTL_PFINFO_XTAB;
+ continue;
+ }
+
+ if ( pfn_type[j] == XEN_DOMCTL_PFINFO_XTAB )
+ {
+ DPRINTF("type fail: page %i mfn %08lx\n", j, gmfn);
+ continue;
+ }
+
+ /* canonicalise mfn->pfn */
+ pfn_type[j] |= pfn_batch[j];
+ ++run;
+
+ if ( debug )
+ {
+ if ( hvm )
+ DPRINTF("%d pfn=%08lx sum=%08lx\n",
+ iter,
+ pfn_type[j],
+ csum_page(region_base + (PAGE_SIZE*j)));
+ else
DPRINTF("%d pfn= %08lx mfn= %08lx [mfn]= %08lx"
" sum= %08lx\n",
iter,
- pfn_type[j] | pfn_batch[j],
- mfn,
- mfn_to_pfn(mfn),
+ pfn_type[j],
+ gmfn,
+ mfn_to_pfn(gmfn),
csum_page(region_base + (PAGE_SIZE*j)));
-
- /* canonicalise mfn->pfn */
- pfn_type[j] |= pfn_batch[j];
}
}
+ if ( !run )
+ {
+ munmap(region_base, batch*PAGE_SIZE);
+ continue; /* bail on this batch: no valid pages */
+ }
+
if ( wrexact(io_fd, &batch, sizeof(unsigned int)) )
{
PERROR("Error when writing to state file (2)");
for ( j = 0; j < k; j++ )
{
- unsigned long type = 0, mfn = arr[j];
+ unsigned long type = 0, mfn = gmfn_to_mfn(d, arr[j]);
page = mfn_to_page(mfn);
- if ( unlikely(!mfn_valid(mfn)) )
+ if ( unlikely(!mfn_valid(mfn)) ||
+ unlikely(is_xen_heap_mfn(mfn)) )
type = XEN_DOMCTL_PFINFO_XTAB;
else if ( xsm_getpageframeinfo(page) != 0 )
;
for ( j = 0; j < k; j++ )
{
struct page_info *page;
- unsigned long mfn = arr32[j];
+ unsigned long mfn = gmfn_to_mfn(d, arr32[j]);
page = mfn_to_page(mfn);
if ( domctl->cmd == XEN_DOMCTL_getpageframeinfo3)
arr32[j] = 0;
- if ( unlikely(!mfn_valid(mfn)) )
+ if ( unlikely(!mfn_valid(mfn)) ||
+ unlikely(is_xen_heap_mfn(mfn)) )
arr32[j] |= XEN_DOMCTL_PFINFO_XTAB;
else if ( xsm_getpageframeinfo(page) != 0 )
continue;